﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sebrae.Academico.Trilhas.BM.Classes;
using Sebrae.Academico.Trilhas.Dominio.Classes;
using Sebrae.Academico.InfraEstrutura.Core.UnitOfWork;

namespace Sebrae.Academico.Trilhas.BP
{
    public class ManterTrilhaNivel
    {
        private BMTrilhaNivel trilhaNivel = null;
        private UnitOfWork unitOfWork;

        public ManterTrilhaNivel()
        {
        }

        public void Incluir(TrilhaNivel pTrilhaNivel)
        {
            try
            {
                unitOfWork = new UnitOfWork();
                trilhaNivel = new BMTrilhaNivel(unitOfWork);

                trilhaNivel.ValidarInstancia(pTrilhaNivel);

                if (String.IsNullOrWhiteSpace(pTrilhaNivel.Nome))
                    throw new Exception("Nome informado está vazio.");

                trilhaNivel.Salvar(pTrilhaNivel);
            }
            catch (Exception ex)
            {
                //unitOfWork.Rollback();
                throw ex;
            }
        }

        public void Alterar(TrilhaNivel pTrilhaNivel)
        {
            try
            {
                unitOfWork = new UnitOfWork();
                trilhaNivel = new BMTrilhaNivel(unitOfWork);

                trilhaNivel.ValidarInstancia(pTrilhaNivel);

                if (String.IsNullOrWhiteSpace(pTrilhaNivel.Nome))
                    throw new Exception("Nome informado está vazio.");

                trilhaNivel.Salvar(pTrilhaNivel);
            }
            catch (Exception ex)
            {
                //unitOfWork.Rollback();
                throw ex;
            }
        }

        public void Excluir(TrilhaNivel pTrilhaNivel)
        {
            try
            {
                unitOfWork = new UnitOfWork();
                trilhaNivel = new BMTrilhaNivel(unitOfWork);

                trilhaNivel.ValidarInstancia(pTrilhaNivel);

                if (trilhaNivel.ValidarDependencias(pTrilhaNivel))
                {
                    throw new Exception("Não é possível excluir este registro, uma vez que ele possui outros registros dependentes");
                }
           
                trilhaNivel.Excluir(pTrilhaNivel);
            }
            catch (Exception ex)
            {
                //unitOfWork.Rollback();
                throw ex;
            }
        }

        public IList<TrilhaNivel> ObterTodos()
        {
            try
            {
                unitOfWork = new UnitOfWork();
                trilhaNivel = new BMTrilhaNivel(unitOfWork);
                return trilhaNivel.ObterTodos();
            }
            catch (Exception ex)
            {
                //unitOfWork.Rollback();
                throw ex;
            }
        }

        public TrilhaNivel ObterTrilhaNivelporID(int pId)
        {
            try
            {
                unitOfWork = new UnitOfWork();
                trilhaNivel = new BMTrilhaNivel(unitOfWork);

                return trilhaNivel.ObterporID(pId);
            }
            catch (Exception ex)
            {
                //unitOfWork.Rollback();
                throw ex;
            }
        }

        public IList<TrilhaNivel> ObterTrilhaNivelPreRequisito()
        {
            try
            {
                unitOfWork = new UnitOfWork();
                trilhaNivel = new BMTrilhaNivel(unitOfWork);

                return trilhaNivel.ObterTrilhaNivelPreRequisito();
            }
            catch (Exception ex)
            {
                //unitOfWork.Rollback();
                throw ex;
            }
        }

        public IList<TrilhaNivel> ObterDadosPesquisa(string pNome, int pIdPreRequisito, int pPrazoemDias)
        {
            unitOfWork = new UnitOfWork();
            trilhaNivel = new BMTrilhaNivel(unitOfWork);

            TrilhaNivel PreRequisito = this.ObterTrilhaNivelporID(pIdPreRequisito);


            return trilhaNivel.ObterDadosPesquisa(pNome, PreRequisito, pPrazoemDias);
        }
    }
}
